package utils

import (
	"crypto/md5"
	"encoding/hex"
	"net/http"

	"github.com/gin-gonic/gin"
	"github.com/google/uuid"
)

type Response struct {
	Code int         `json:"code"`
	Msg  string      `json:"msg"`
	Data interface{} `json:"data"`
}

// 响应成功函数 SuccessResponse(c, data, "操作成功", 0) msg、code 为可选参数
func SuccessResponse(c *gin.Context, data interface{}, opts ...interface{}) {
	// 默认值
	code := 0
	msg := "成功"

	// 检查可变参数
	if len(opts) > 0 {
		if v, ok := opts[0].(string); ok {
			msg = v
		}
	}
	if len(opts) > 1 {
		if v, ok := opts[1].(int); ok {
			code = v
		}
	}

	// 处理data默认返回空数组
	if data == nil {
		data = []interface{}{}
	}

	c.JSON(http.StatusOK, Response{
		Code: code,
		Msg:  msg,
		Data: data,
	})
}

// 响应成功函数 SuccessResponse(c, data, "操作失败", 1) msg、code 为可选参数
func ErrorResponse(c *gin.Context, data interface{}, opts ...interface{}) {
	// 默认值
	code := 1
	msg := "失败"

	// 检查可变参数
	if len(opts) > 0 {
		if v, ok := opts[0].(string); ok {
			msg = v
		}
	}
	if len(opts) > 1 {
		if v, ok := opts[1].(int); ok {
			code = v
		}
	}

	// 处理data默认返回空数组
	if data == nil {
		data = []interface{}{}
	}

	c.JSON(http.StatusOK, Response{
		Code: code,
		Msg:  msg,
		Data: data,
	})
}

// 获取uuid
func UUID() string {
	return uuid.New().String()
}

// GeneratePassword 用于生成与 PHP 中相同的密码规则
func GeneratePassword(password string) string {
	// 计算两次 md5
	hash1 := md5.Sum([]byte(password))
	hash2 := md5.Sum([]byte(hex.EncodeToString(hash1[:])))

	// 将两次 md5 的结果转为字符串并加上 "###" 前缀
	return "###" + hex.EncodeToString(hash2[:])
}

// GetSecondsInADay 返回一天的秒数
func GetSecondsInADay() int {
	return 86400 // 24小时 * 60分钟 * 60秒 = 86400秒
}
